package com.cly.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.cly.dto.FileChunkDto;
import com.cly.entity.File;
import com.cly.result.JsonRequest;
import org.springframework.http.ResponseEntity;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody;

import java.util.List;

/**
 * 文件服务层接口
 *
 * @author by 春风能解释
 * <p>
 * 2024/8/29
 */
public interface IFileService extends IService<File> {

    /**
     * 分页查询文件
     *
     * @param current 页码
     * @param size    页长
     * @param file    条件
     * @return JSON
     */
    JsonRequest<List<File>> pageFile(Integer current, Integer size, File file);

    /**
     * 根据ID查询文件信息
     *
     * @param id 文件ID
     * @return JSON
     */
    JsonRequest<File> getOne(Long id);


    /**
     * 文件上传并返回ID
     *
     * @param file 文件
     * @return JSON
     */
    JsonRequest<Long> uploadFile(MultipartFile file);

    /**
     * 添加文件备注
     *
     * @param file 数据
     * @return JSON
     */
    JsonRequest<Integer> addNote(File file);

    /**
     * 根据ID删除文件
     *
     * @param id 文件ID
     * @return JSON
     */
    JsonRequest<Integer> deleteFileById(List<Long> id);

    /**
     * 根据ID文件下载
     *
     * @param id 文件路径
     * @return ResponseEntity
     */
    ResponseEntity<StreamingResponseBody> showFile(Long id);

    /**
     * 分片下载文件
     *
     * @param id    文件ID
     * @param range 请求头中的Range
     * @return ResponseEntity
     */
    ResponseEntity<StreamingResponseBody> chunkDownload(Long id, String range);

    /**
     * 判断是否为图片
     *
     * @param id 文件ID
     * @return JSON
     */
    JsonRequest<Boolean> isImage(Long id);

    /**
     * 检查文件是否已上传
     *
     * @param fileChunk 文件分片传输对象
     * @return JSON
     */
    JsonRequest<Long> checkFile(FileChunkDto fileChunk);

    /**
     * 文件分片上传
     *
     * @param fileChunk 文件分片传输对象
     * @return JSON
     */
    JsonRequest<List<Long>> uploadFileChunk(FileChunkDto fileChunk);

    /**
     * 合并文件
     *
     * @param fileChunk 文件分片传输对象
     * @return JSON
     */
    JsonRequest<Long> mergeFile(FileChunkDto fileChunk);

    /**
     * 批量下载文件
     *
     * @param ids 文件ID
     * @return JSON
     */
    JsonRequest<Long> zipDownloadFiles(List<Long> ids);
}
